package com.xueyi.core.utils;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xueyi.core.expection.BusinessException;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * @author 俞烨
 * @version 1.0
 * @description: 签名工具类
 * @date 2024/4/4 15:42
 */
public class SignUtil {

    /**
     * 默认的签名Key
     */
    private static final String DEFAULT_SIGN_KEY = "DEFAULT_SIGN_KEY";
    private static final Sign SIGN = SecureUtil.sign(SignAlgorithm.MD5withRSA);

    /**
     * 使用默认签名
     *
     * @param data 需要进行签名的数据
     * @return
     */
    public static String sign(Object data) {
        return sign(data, DEFAULT_SIGN_KEY);
    }

    /**
     * 自定义签名Key
     *
     * @param data    需要进行签名的数据
     * @param signKey 自定义的签名key
     * @return
     */
    public static String sign(Object data, String signKey) {

        if (data == null) {
            throw new BusinessException(100, "需要签名的内容为空");
        }
        // 进行ASCII排序
        char[] charArray = JSON.toJSONString(data).concat(signKey).toCharArray();
        Arrays.sort(charArray);
        String lastContent = new String(charArray);
        return SIGN.signHex(lastContent);
    }

    /**
     * 验证前面
     *
     * @param data 需要进行签名的数据
     * @param sign 验证的sign
     * @return
     */
    public static boolean verify(Object data, String sign) {
        return verify(data, sign, DEFAULT_SIGN_KEY);
    }

    /**
     * 验证前面
     *
     * @param data    需要进行签名的数据
     * @param sign    验证的sign
     * @param signKey 自定义的签名Key
     * @return
     */
    public static boolean verify(Object data, String sign, String signKey) {

        if (data == null) {
            throw new BusinessException(100, "需要签名的内容为空");
        }
        // 进行ASCII排序
        char[] charArray = JSON.toJSONString(data).concat(signKey).toCharArray();
        Arrays.sort(charArray);
        String lastContent = new String(charArray);
        return SIGN.verify(lastContent.getBytes(StandardCharsets.UTF_8), sign.getBytes(StandardCharsets.UTF_8));
    }

    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("accountId", "233");
        System.out.println(sign(jsonObject));
    }
}
